import 'dart:convert';

void main() {
//  class3();
//  var emp = new ZhangSan.fromJson({});
//  var eff = new EffectiveDoer();
//  eff.doSomething();

  print(greetBob(Person2('Kathy')));
  print(greetBob(Impostor()));
}

void class1() {
  var p = Point(2, 2);

  // 为实例的变量 y 设置值。
  p.y = 3;

  // 获取变量 y 的值。
  assert(p.y == 3);

  // 调用 p 的 distanceTo() 方法。
  num distance = p.distanceTo(Point(4, 4));

  print(distance);
}

void class2() {
  var p2 = Point.fromJson({'x': 1, 'y': 2});
  num distance = p2.x - p2.y;
  print(distance);
  // 获取对象类型
  print('The type of p2 is ${p2.runtimeType}');
}

void class3() {
  var point = Point(null, null);
  point.x = 4; // Use the setter method for x.
  assert(point.x == 4); // Use the getter method for x.
  assert(point.y == null); // Values default to null.
  print("ok");
}

class Point {
  num x;
  num y;
  Point(this.x, this.y);
//  Point(num x, num y) {
//    this.x = x;
//    this.y = y;
//  }

  // 命名构造函数
  Point.origin() {
    x = 0;
    y = 0;
  }

  num distanceTo(Point point) {
    return point.x - point.y;
  }

  static Point fromJson(Map dic) {
    return Point(dic["x"], dic['y']);
  }
}

class Person {
  String name;

  Person.fromJson(Map data) {
    print('in Person');
  }
}

class ZhangSan extends Person{
  ZhangSan.fromJson(Map data) : super.fromJson(data) {
    print('in 张三');
  }

}

abstract class Doer {
  // 定义实例变量和方法 ...

  void doSomething(); // 定义一个抽象方法。
}

class EffectiveDoer extends Doer {
  void doSomething() {
    // 提供方法实现，所以这里的方法就不是抽象方法了...
    print("实现抽象方法");
  }
}

// person 类。 隐式接口里面包含了 greet() 方法声明。
class Person2 {
  // 包含在接口里，但只在当前库中可见。
  final _name;

  // 不包含在接口里，因为这是一个构造函数。
  Person2(this._name);

  // 包含在接口里。
  String greet(String who) => 'Hello, $who. I am $_name.';
}

// person 接口的实现。
class Impostor implements Person2 {
  get _name => '';

  String greet(String who) => 'Hi $who. Do you know who I am?';
}

String greetBob(Person2 person) => person.greet('Bob');